;> FMonitor
 LEADR &F0000
R0 RN 0
R1 RN 1
R2 RN 2
R3 RN 3
R4 RN 4
R5 RN 5
R6 RN 6
R7 RN 7
R8 RN 8
R9 RN 9
R10 RN 10
R11 RN 11
R12 RN 12
R13 RN 13
R14 RN 14
R15 RN 15
PC RN R15
SP RN R13
CR * 13
LF * 10
CCMASK * &FC000003
 ^ 0
WRITEC # 1
WRITES # 1
WRITE0 # 1
NEWLINE # 1
READC # 1
CLI # 1
BYTE # 1
WORD # 1
FILE # 1
ARGS # 1
BGET # 1
BPUT # 1
MULTIPLE # 1
OPEN # 1
READLINE # 1
CONTROL # 1
GETENV # 1
EXIT # 1
SETENV # 1
INTON # 1
INTOFF # 1
CALLBACK # 1
ENTERSWI # 1
BREAKPT # 1
BREAKCT # 1
UNUSEDSWI # 1
SETMEMC # 1
SETCALLBACK # 1
WRITEI * 256
START SWI WRITES
 = "Quick and Dirty Kernel Call Monitor: Press BREAK to remove!",10,13
 = "High memory is set to:  ",0
 ADR R10,START
 BL WORDHX
 MOV R0,#0
 ADR R1,START
 MOV R2,#0
 MOV R3,#2
 MOV R4,#0
 MOV R5,#0
 MOV R6,#0
 MOV R7,#0
 SWI SETENV
 SWI WRITES
 = 10,13,"Exit Handler was:       ",0
 MOV R10,R0
 BL WORDHX
 SWI WRITES
 = 10,13,"Real End of memory was: ",0
 MOV R10,R2
 BL WORDHX
 SWI WRITES
 = 10,13,"Buffering is O",0
 TEQ R3,#0
 SWIEQ WRITEI+"F"
 SWIEQ WRITEI+"F"
 SWINE WRITEI+"N"
 SWI WRITES
 = 10,13,"Undefined handler was:  ",0
 MOV R10,R4
 BL WORDHX
 SWI WRITES
 = 10,13,"Prefetch handler was:   ",0
 MOV R10,R5
 BL WORDHX
 SWI WRITES
 = 10,13,"Data abort handler was: ",0
 MOV R10,R6
 BL WORDHX
 SWI WRITES
 = 10,13,"Address handler was:    ",0
 MOV R10,R7
 BL WORDHX
 SWI NEWLINE
 BL GETSPACE
 STR R8,TEXT
 ADR R1,MYTRACER
 BL SVCADR
 STR R2,OLDSVC
 ADR R1,MYTRACER
 CMP R2,R1
 SWINE EXIT
 LDR R1,OLDSVC
 BL SVCADR
 SWI WRITES
 = "Can't install!!!",0
 SWI EXIT
SHOWALL MOV R0,#0
 STRB R0,[R8],#1
 BL GETSPACE
 MOV R0,R8
 MOV R6,#0
 STR R6,TEXT
 LDR R6,(LOCALSTACK+14*4)
 SWI WRITE0
 STR R6,(LOCALSTACK+14*4)
SHOWALLX BL GETSPACE
NOTRACE STR R8,TEXT
 ADR R9,LOCALSTACK
 LDMIA R9,{R0-R14}
 LDR PC,OLDSVC
OLDSVC & 0
HISR13 & 0
TEXT & 0
LOCALSTACK & 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
MYTRACER STR R13,HISR13
 ADR R13,LOCALSTACK
 STMIA R13,{R0-R14}
 MOV R12,R13
 LDR R13,HISR13
 STR R13,[R12,#13*4]
 MOV R11,R14
 BIC R10,R11,#CCMASK
 LDR R10,[R10,#-4]
 BIC R10,R10,#&FF000000
 LDR R8,TEXT
 CMP R10,#EXIT
 BEQ SHOWALL
 CMP R10,#READC
 BCC NOTRACE
 CMP R10,#WRITEI
 BCS NOTRACE
 CMP R8,#0
 BEQ NOTRACE
 ADR R1,SWITAB
 CMP R10,#WRITEI
 MOVCS R10,#SETCALLBACK+1
 ADD R1,R1,R10,LSL #3
 MOV R2,#8
DISSW0 LDRB R0,[R1],#1
 STRB R0,[R8],#1
 SUBS R2,R2,#1
 BNE DISSW0
 MOV R0,#"@"
 STRB R0,[R8],#1
 SUB R10,R11,#4
 BL WORDHX2A
 MOV R0,#"0"
 LDR R10,[R12]
 BL WORDHX2
 MOV R0,#"1"
 LDR R10,[R12,#1*4]
 BL WORDHX2
 MOV R0,#"2"
 LDR R10,[R12,#2*4]
 BL WORDHX2
 MOV R0,#"3"
 LDR R10,[R12,#3*4]
 BL WORDHX2
 MOV R0,#"4"
 LDR R10,[R12,#4*4]
 BL WORDHX2
 MOV R0,#10
 STRB R0,[R8],#1
 MOV R0,#13
 STRB R0,[R8],#1
 B NOTRACE
SWITAB = "WriteC  "
 = "WriteS  "
 = "Write0  "
 = "NewLine "
 = "ReadC   "
 = "CLI     "
 = "Byte    "
 = "Word    "
 = "File    "
 = "Args    "
 = "BGet    "
 = "BPut    "
 = "Multiple"
 = "Open    "
 = "ReadLine"
 = "Control "
 = "GetEnv  "
 = "Exit    "
 = "SetEnv  "
 = "IntOn   "
 = "IntOff  "
 = "CallBack"
 = "EnterOS "
 = "BreakPT "
 = "BreakCT "
 = "UnUsed  "
 = "SetMEMC "
 = "SetCallB"
 = "WriteI  "
SVCADR SUB R1,R1,#&10 ;plant new svc handler (addr in R1) return old (in R2)
 MOV R1,R1,LSR #2
 ORR R1,R1,#&EA000000
 MOV R0,#8 ;plant handler
 LDR R2,[R0]
 STR R1,[R0]
 BIC R2,R2,#&FF000000
 MOV R2,R2,LSL #2
 ADD R2,R2,#&10
 MOV PC,R14
WORDHX MOV R9,#32-4
WORDLP MOV R0,R10,LSR R9
 AND R0,R0,#15
 CMP R0,#9
 ORRLS R0,R0,#"0"
 ADDHI R0,R0,#"A"-10
 SWI WRITEC
 SUBS R9,R9,#4
 BPL WORDLP
 MOV PC,R14
WORDHX2 MOV R9,#" "
 STRB R9,[R8],#1
 STRB R0,[R8],#1
 STRB R9,[R8],#1
WORDHX2A MOV R9,#32-4
WORDLP2 MOV R0,R10,LSR R9
 AND R0,R0,#15
 CMP R0,#9
 ORRLS R0,R0,#"0"
 ADDHI R0,R0,#"A"-10
 STRB R0,[R8],#1
 SUBS R9,R9,#4
 BPL WORDLP2
 MOV PC,R14
GETSPACE ADR R8,SPACE
 MOV PC,R14
SPACE & 0
 END
